虽然R语言是一门针对统计学的语言,但并不就代表它不可以实现最基本的计算功能,multiprocessing。 需要使用的packages, 就拿我自己做的分析来举例: 如何计算得到每一个gene的FST? 前提条件说了很多了,只是为了希望做分析的人能够理解这个问题。 但是在给出自己的代码之前,先给出R parallel的基本使用。 直接使用multiprocessing方法时,不需要自行创建cluster来预设对应包含线程数的sockets,而用起来就像lapply一样,但是与其不同的是,lapply是将所有的函数依次应用到输入的每一个list上,而multiprocessing的lapply则是同时发动所有的任务, 使用函数, 核心模块, 但是我还存在的疑问:为什么input_df和gene_bed就不export就不会报错了呢? Note:这里的理解,就好比神经网络模型使用CUDA时,也需要将对应张量加载到GPU上 创建sockets还可以使用不同的模式。。 写在前面
R | parallel的使用
parallel
。
R | parallele | multiprocessing
R | parallele | sockets
cluster_1 <- makeCluster(16) # 可以使用detectCores()来检测总共有多少个核
stopCluster(cluster_1)
R | 我的population genetics实战
chr.vector
,是包含了chr1tochr22的chromosome tag的向量,需要先将其输出到cluster,才能够应用于cluster计算
parLapply(cluster_1, chr.vector, df = input_df, fun = function(input_df, chr_number, gene_bed){
# retrieve output dataset using chromosome tag {1..21} to split the FST dataset
chr_number_input_df <- input_df %>% filter(chr==chr_number)
...
}
cluster_1 <- makeCluster(16) # using 16 cores to speed up the FST calculation process.
clusterExport(cluster_1, "chr.vector") # export chromosome vector the sockets
#
FST_list <- parLapply(cluster_1, chr.vector, df = input_df, fun = function(input_df, chr_number, gene_bed){
# retrieve output dataset using chromosome tag {1..21} to split the FST dataset
chr_number_input_df <- input_df %>% filter(chr==chr_number)
new_chr_number_input_df = chr_number_input_df %>% left_join(gene_bed, by=c("chr"))
# only save the validated records
new_chr_number_input_df <- new_chr_number_input_df %>% filter((pos >= start_pos & pos <= end_pos))
# using 0 to replace negative value
new_chr_number_input_df$weight_FST[new_chr_number_input_df$weight_FST < 0] <- 0
# calculate FST for each gene
cal_df <- new_chr_number_input_df %>%
group_by(gene) %>%
summarize(
Mean_Fst = mean(weight_FST, na.rm = TRUE)
)
return(cal_df)
})
# close cluster
stopCluster(cluster_1)
推荐阅读
Hi,这里是有朴的第二大脑。
很高兴与你相遇
很高兴与你相遇